home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / mmu / MuManual / Autodocs / mmures.doc < prev   
Text File  |  2002-03-12  |  73KB  |  2,101 lines

  1. TABLE OF CONTENTS
  2.  
  3. mmu.resource/--Background--
  4.  
  5. mmu.resource/--Background--             mmu.resource/--Background--
  6.  
  7.     PURPOSE
  8.     The mmu.resource is the low-level driver of the mmu.library;
  9.     it is just one level above hardware and is the interface of
  10.     the mmu.library to the hardware. There is absolutely no need
  11.     to make use of this resource whatsoever; the calling syntax is
  12.     wierd and requires assembly language necessarely. Many things
  13.     within this resource work much different than you might expect.
  14.  
  15.     In case the mmu.resource is found available when the mmu.library
  16.     is opened, the library will use the resource to get its dirty
  17.     work done. That is, the construction of the MMU table descriptors,
  18.     the exception handler and similar. If the mmu.resource is not
  19.     found active, the mmu.library tries to figure this out itself.
  20.     It will check for the available routine and will use internal
  21.     routines that provide similar functions than the resource. It
  22.     will not try to build a mmu.resource, though.
  23.  
  24.     The mmu.resource could be used to make use of the mmu.library
  25.     in an environment that is not supported by the library initially,
  26.     as for example more advanced processors, external MMUs or even
  27.     "software emulated" MMUs for emulators. Writing a mmu.resource
  28.     for a non-68K MMU might be possible provided the programming
  29.     model of this CPU is close enough to that of the Motorola's.
  30.  
  31.     In order to make the mmu.library use your resource routines,
  32.     your hardware/software should make the resource available on
  33.     boot-up by means of AddResource() before the mmu.library gets
  34.     loaded.
  35.  
  36.     The calling syntax of the mmu.resource is, indeed, strange.
  37.     This is because most of its functions are used by the core
  38.     code of the mmu.library, and hence must expect the a6 register
  39.     loaded with the base pointer of the mmu.library, and not this
  40.     resource. Some calls require multiple return values in several
  41.     registers, or even the condition-code register. About the only
  42.     reason why this is so is speed, and tradition - as to mimic the
  43.     former calling syntax of the mmu.library internal routines.
  44.  
  45.     Even though the mmu.resource is just a resource, the typical
  46.     library type entries LibOpen(), LibClose(), LibExpunge() and
  47.     LibExtFunc() should be available. They are currently not used,
  48.     though.
  49. mmu.resource/CheckMMUInterface            mmu.resource/CheckMMUInterface
  50.  
  51.     NAME
  52.     CheckMMUInterface - check for the required API interface level
  53.  
  54.     SYNOPSIS
  55.     okflag = CheckMMUInterface( version, mmubase, mmuresbase );
  56.     d0                d0    a0    a6
  57.     
  58.     BOOL CheckMMUInterface( UWORD, struct MMUBase *, struct MMUResBase);
  59.  
  60.     FUNCTION
  61.     Checks whether the expected API level of the mmu.resource matches
  62.     the requirements of the mmu.library and delivers the mmu.library
  63.     base pointer to the resource.
  64.  
  65.     INPUTS
  66.     version    - the version number of the mmu.resource API the mmu.library
  67.     expects to be available. This need not to coincide with the version of
  68.     the mmu.library, though.
  69.  
  70.     mmubase - base pointer of the mmu.library based for internal use of
  71.     the resource.
  72.  
  73.     mmuresbase - base pointer of the resource itself.
  74.  
  75.     RETURNS
  76.     TRUE in case the resource can service the API whose version is
  77.     indicated by the "version" argument; FALSE otherwise.
  78.  
  79.     NOTES
  80.     Note that the API version of the mmu.library need not to coincide
  81.     with its library version. The lowest available API level of the
  82.     library is 43; you should currently check for this value and fail
  83.     if you get anything different. Future versions of the mmu.library
  84.     might require an enhanced interface and will then bump this
  85.     release number.
  86.  
  87.     This function will be called first by the mmu.library as soon as
  88.     it detects that the mmu.resource is available. If the result
  89.     value is FALSE, the mmu.library will revert to its own internal
  90.     CPU/MMU check and will try to select a proper internal set of
  91.     support routines.
  92.  
  93.     BUGS
  94.  
  95.     SEE ALSO
  96.  
  97. mmu.resource/MMUResType                    mmu.resource/MMUResType
  98.  
  99.     NAME
  100.     MMUResType - provide a one-byte identifier specifying the
  101.     MMU type that gets supported
  102.  
  103.     SYNOPSIS
  104.     type = MMUResType( mmuresbase );
  105.     d0              a6
  106.  
  107.     char MMUResType( struct MMUResBase * );
  108.  
  109.     FUNCTION
  110.     Returns the ID of the mmu that is supported by this resource. This
  111.     number will be forwarded to application programs by means of the
  112.     mmu.library call GetMMUType().
  113.  
  114.     INPUTS
  115.     mmuresbase    -    a pointer to the mmu.resource base.
  116.  
  117.     RETURNS
  118.     an identifier specifying the mmu that is available.
  119.  
  120.     NOTES
  121.  
  122.     BUGS
  123.  
  124.     SEE ALSO
  125.     mmu.library/GetMMUType()
  126. mmu.resource/AdjustCtxtSettings            mmu.resource/AdjustCtxtSettings
  127.  
  128.     NAME
  129.     AdjustCtxtSettings - optimize a MMUContext for best performance
  130.  
  131.     SYNPOSIS
  132.     okflag = AdjustCtxtSettings( ctxt, mmubase );
  133.     d0                       a5     a6
  134.  
  135.     BOOL AdjustCtxtSettings( struct IMMUContext *, struct MMUBase *);
  136.     
  137.     FUNCTION
  138.     This function is called after the mmu.library identified the
  139.     initial MMU profile by means of ReadMMUConfig(). It is supposed
  140.     to modify the read ctxt->ctx_LevelxBits, ctxt->PageBits    and 
  141.     ctxt->ctx_InitialShift bits in the following way, guaranteeing
  142.     that the sum of all these bit counters remains 32 - the number of
  143.     bits required to address the full address range of the MC68K
  144.     processor.
  145.  
  146.     - the initial shift must be arranged to be zero by possibly
  147.       enlarging the number of bits in the levels below.
  148.     - the page size should be adjusted to a reasonable default
  149.       value if it is supposed to be non-sensical. This depends on
  150.       your own choice, but as the mmu.library gets rather un-
  151.       effective for small pages, page sizes below 1K and above 8K
  152.       should possibly be avoided.
  153.  
  154.     INPUTS
  155.     ctxt - a pointer to the IMMUContext structure to be modified.
  156.     mmubase - base pointer of the mmu.library.
  157.  
  158.     RESULTS
  159.     a TRUE/FALSE indicator telling the mmu.library whether the
  160.     resource was successful to establish a useable setting.
  161.  
  162.     NOTES    
  163.     Note that a6 is loaded with the base of the mmu.library, not
  164.     that of the resource.
  165.  
  166.     This function need not to update all the mask values of the
  167.     IMMUContext. This is done by the library internally afterwards.
  168.  
  169.     The internal mmu.library drivers do not try to modify the page
  170.     size, except for the 68030 and 68851 drivers which will reject
  171.     to use a page size smaller than 1K and will then use a default
  172.     setting. It is probably a good idea to use the same approach
  173.     to come to a useful MMU setup.
  174.  
  175.     BUGS
  176.  
  177.     SEE ALSO
  178.     ReadMMUConfig()
  179. mmu.resource/ReadMMUConfig            mmu.resource/ReadMMUConfig
  180.  
  181.     NAME
  182.     ReadMMUConfig() - read out the MMU register setup
  183.  
  184.     SYNOPSIS
  185.     ReadMMUConfig( config, mmubase );
  186.             a0    a6
  187.  
  188.     void ReadMMUConfig(struct MMUConfig *, struct MMUBase *);
  189.  
  190.     FUNCTION
  191.     Reads all relevant MMU hardware registers and fills them into
  192.     the IMMUConfig structure for further processing.
  193.  
  194.     INPUTS
  195.     config - pointer to the struct MMUConfig to fill out.
  196.     mmubase - base pointer to the mmu.library
  197.  
  198.     RESULTS
  199.     
  200.     NOTES
  201.     Note that a6 points to the mmu.library base, not to the resource
  202.     base.
  203.  
  204.     This call need not to make a complete backup of the MMU setup;
  205.     only those registers that are relevant for the MMU programming
  206.     model need to be saved. The meaning of the components of the
  207.     MMUConfig structure are, even though documented, up to you and
  208.     the hardware requirements.
  209.  
  210.     This function is called in supervisor mode and should return
  211.     to the caller with an RTS.
  212.     
  213.  
  214.     BUGS
  215.  
  216.     SEE ALSO
  217.     mmu/config.h,WriteMMUConfig(),BuildMMUConfig()
  218. mmu.resource/WriteMMUConfig            mmu.resource/WriteMMUConfig
  219.  
  220.     NAME
  221.     WriteMMUConfig() - load an MMU configuration into the hardware
  222.  
  223.     SYNOPSIS
  224.     WriteMMUConfig( config, mmubase );
  225.               a0      a6
  226.  
  227.     void WriteMMUConfig(struct MMUConfig *, struct MMUBase *);
  228.  
  229.     FUNCTION
  230.     Writes the configuration described by the struct MMUConfig into
  231.     the hardware and flushes caches as required.
  232.  
  233.     INPUTS
  234.     config - pointer to a struct MMUConfig to be loaded into the 
  235.          hardware
  236.     mmubase - pointer to the mmu.library base.
  237.  
  238.     RESULTS
  239.  
  240.     NOTES
  241.     Note that a6 points to the mmu.library base, not to the resource
  242.     base.
  243.  
  244.     This call installs all relevant data of the MMUConfig back into
  245.     the hardware; dependent on the MMU, various caches must be
  246.     flushed here as well. The suggested operation works as follows:
  247.  
  248.     - interrupts should be disabled by writing into the sr
  249.     - caches should be pushed back if required
  250.     - the MMU should be disabled,
  251.     - address translation caches should be flushed,
  252.     - transparent translation should be installed,
  253.     - MMU root pointers should be installed,
  254.     - MMU translation registers should be installed,
  255.     - caches should be flushed/pushed again.
  256.  
  257.     This function is called in supervisor mode, it should return to
  258.     the caller by means of an RTS.
  259.  
  260.     The function may leave interrupts disabled; they will be re-
  261.     enabled as soon as the supervisor mode is left by the caller.
  262.  
  263.     This call need not to install all registers; only the registers
  264.     that are relevant to the MMU programming model are required to
  265.     be written back.
  266.  
  267.     On a context switch, the mmu.library will compare all components
  268.     of the MMUContext except the two (user/supervisor) root pointers.
  269.     If these extended registers are equal, a short context switch by
  270.     means of LoadRoot() is engaged; otherwise, a complete context
  271.     switch by this function will be run.
  272.  
  273.     BUGS
  274.  
  275.     SEE ALSO
  276.     mmu/config.h,ReadMMUConfig(),BuildMMUConfig(),LoadRoot()
  277. mmu.resource/BuildMMUConfig            mmu.resource/BuildMMUConfig
  278.  
  279.     NAME
  280.     BuildMMUConfig() - build a new MMU configuration from templates
  281.  
  282.     SYNOPSIS
  283.     ok = BuildMMUConfig( uctx, sctx, defconfig, destconfig, mmubase);
  284.     d0              a0    a1        a2        a3      a6
  285.  
  286.     BOOL BuildMMUConfig(struct IMMUContext *, struct IMMUConctext *,
  287.                 struct MMUConfig *,struct MMUConfig *,
  288.                 struct MMUBase *);
  289.  
  290.     FUNCTION
  291.     Fills in a new struct MMUConfig by combining data from the default
  292.     configuration, the user and the supervisor context. This function
  293.     is called by the mmu.library whenever the configuration of a new
  294.     context must be created. It should write the MMU root pointers of
  295.     the user and supervisor contexts into the MMUConfig, and fill the
  296.     remaining data of the configuration with default values from the
  297.     default configuration.
  298.  
  299.     INPUTS
  300.     uctx -    the user context whose configuration should be build. This
  301.         shall be the origin of the user root pointer. Further, the
  302.         page layout shall be taken from the uctx->ctx_LevelABits...
  303.         uctx->ctx_LevelDBits, uctx->ctx_PageBits bits and should
  304.         modify the translation control provided by defconfig ac-
  305.         cordingly before this data goes into the translation control
  306.         of destconfig.
  307.         Further, this procedure should clear transparent translation
  308.         if the uctx->ctx_Flags say so.
  309.  
  310.     sctx -    the supervisor context of the uctx. This is the origin of the
  311.         supervisor root pointer.
  312.  
  313.     defconfig - the default MMU configuration that was read by the
  314.             mmu.library on startup. Remaining registers of the MMU
  315.             programming model should be taken from here.
  316.     destconfig - destination MMU configuration to fill out.
  317.     mmubase - pointer to the mmu.library base.
  318.  
  319.     RESULTS
  320.     a boolean success/failure indicator. Should return TRUE in case
  321.     the configuration could be build successfully, FALSE otherwise
  322.     if for example the page configuration specified by the context is
  323.     not available.
  324.  
  325.     NOTES
  326.     Note that a6 points to the mmu.library base, not to the resource
  327.     base.
  328.  
  329.     BUGS
  330.  
  331.     SEE ALSO
  332.     mmu/config.h,ReadMMUConfig(),WriteMMUConfig()
  333. mmu.library/LoadRoot                    mmu.library/LoadRoot
  334.  
  335.     NAME
  336.     LoadRoot() - perform a minor context switch
  337.  
  338.     SYNOPSIS
  339.     LoadRoot( uroot, sroot, mmubase);
  340.             a0       a1      a6
  341.  
  342.     void LoadRoot( void *, void *, struct MMUBase *);
  343.  
  344.     FUNCTION
  345.     Performs a minor context switch by exchanging user, supervisor or
  346.     both MMU root pointers.
  347.  
  348.     INPUTS
  349.     uroot - the user MMU root pointer or NULL in case the user root
  350.         pointer shall remain unaltered.
  351.     sroot -    the supervisor MMU root pointer or NULL in case it need not
  352.         to be touched.
  353.     mmubase - pointer to the mmu.library base.
  354.  
  355.     RESULTS
  356.  
  357.     NOTES
  358.     Note that a6 points to the mmu.library base, not to the resource
  359.     base.
  360.  
  361.     This function installs either a new user or supervisor root pointer
  362.     into the MMU hardware; therefore, this function is called within
  363.     supervisor mode and shall return with an RTS to the user.
  364.  
  365.     This function shall perform the following operations:
  366.  
  367.     - flush the address translation cache,
  368.     - flush/push the cache if the cache is logically indexed. A
  369.       physically indexed cache need not to be pushed.
  370.     - load the user root pointer with the new value
  371.     - flush old user root pointer from a RTC, if available,
  372.       and old user root<>new user root
  373.     - load the supervisor root pointer with the new value,
  374.     - flush old supervisor pointer from a RTC, if available,
  375.       and old supervisor root<>new supervisor root
  376.     - flush the ATC again
  377.  
  378.     The mmu.library calls either this function or WriteMMUConfig()
  379.     on a context switch. If the MMU registers of old and new context
  380.     are identically except for user and supervisor root pointer,
  381.     a minor context switch is run by this function. Otherwise, a
  382.     major context switch by means of WriteMMUConfig() is performed.
  383.  
  384.     BUGS
  385.  
  386.     SEE ALSO
  387.     WriteMMUConfig()
  388. mmu.resource/DefineMMUContext            mmu.resource/DefineMMUContext
  389.  
  390.     NAME
  391.     DefineMMUContext() - fill IMMUContext components with MMU specific
  392.     data from a MMUConfig.
  393.  
  394.     SYNOPSIS
  395.     DefineMMUContext( config, ctxt, mmubase);
  396.                 a0       a5       a6
  397.  
  398.     void DefineMMUConfig( struct MMUConfig *, struct IMMUContext *, 
  399.                   struct MMUBase *);
  400.  
  401.     FUNCTION
  402.     Reads data from the MMUConfig structure, interprets the page
  403.     layout defined by this data and places the results in the
  404.     IMMUContext pointed to by ctxt. This function shall fill
  405.     in:
  406.  
  407.     ctxt->ctx_InitialShift    with the initial shift value
  408.     ctxt->ctx_LevelABits    with the number of address bits to
  409.                 address level A of the MMU table.
  410.     ctxt->ctx_LevelBBits
  411.     ctxt->ctx_LevelCBits
  412.     ctxt->ctx_LevelDBits    ditto up to level D
  413.     ctxt->ctx_PageBits    number of bits of a logical address
  414.                 that define the offset within a page.
  415.  
  416.     If the MMU is disabled, the above should be set to reasonable
  417.     defaults, as for example 4K pages.
  418.  
  419.     ctxt->ctx_LevelAAlign    Page alignment alá AllocAligned() that
  420.                 is required for the level A descriptor
  421.                 level. This must be a power of two.
  422.     ctxt->ctx_LevelBAlign
  423.     ctxt->ctx_LevelCAlign
  424.     ctxt->ctx_LevelDAlign    ditto for levels B..D
  425.  
  426.     ctxt->ctx_DescriptorAlign    alignment restrictions for
  427.                     indirect descriptors.
  428.  
  429.  
  430.     ctxt->ctx_PageMemMask    binary mask of all mapping properties that
  431.                 shall be touched when allocating memory for
  432.                 the MMU table.
  433.     ctxt->ctx_PageMemProp    binary mask of page properties that will be
  434.                 enabled/disabled for memory allocated for MMU
  435.                 page descriptors.
  436.  
  437.     The above two are only kept care of if the user specified
  438.  
  439.     DescriptorCacheInhibit ON
  440.  
  441.     in the ENVARC:MMU-Configuration file. Then, the properties of mmu
  442.     page memory are filtered by 
  443.  
  444.     newprops = oldprops & (~PageMemMask) | PageMemProps
  445.     
  446.     to get the new property flags for the MMU table memory. Otherwise,
  447.     these two are ignored.
  448.  
  449.     ctxt->ctx_PageMemForbid    property flags that must not be set for memory
  450.                 that got allocated for the MMU table.
  451.  
  452.     If the mmu.library finds one of the above properties set for memory
  453.     that it allocated, it will guru. Typically, this mask should contain:
  454.  
  455.     MAPP_BLANK, MAPP_INVALID, MAPP_SWAPPED, MAPP_TRANSLATED, MAPP_ROM,
  456.     MAPP_WRITEPROTECTED, MAPP_BUNDLED, MAPP_SUPERVISORONLY, MAPP_INDIRECT
  457.  
  458.     Note that memory allocated by MEMF_PUBLIC should never have any of the
  459.     properties above. Note further that the mmu.library is able to work
  460.     with MAPP_REMAPPED memory for mmu descriptors since it will first
  461.     translate the physical address to logical before using it for the
  462.     descriptors. This requires, though, that the memory is always
  463.     accessable under its physical address as well.
  464.  
  465.  
  466.     ctxt->ctx_LargestPageSize    largest possible page size with
  467.                     this MMU; not necessarely the
  468.                     active page size.
  469.  
  470.     This value is required by the mmu.library to compute the
  471.     RemapSize() value. It should be a power of two.
  472.  
  473.     INPUTS
  474.     config - struct MMUConfig to be read out.
  475.     ctxt - struct IMMUContext to be filled in.
  476.     mmubase - library base of the mmu.library.
  477.  
  478.     RESULTS
  479.  
  480.     NOTES
  481.     Note that a6 points to the mmu.library base, not to the resource
  482.     base.
  483.  
  484.     This is called by the mmu.library whenever a new context must be
  485.     build; you need not to touch any other mask/flags fields of the
  486.     IMMUContext as the library will compute them itself from the
  487.     data you provided. Note further that you should not cheat here
  488.     with the settings to get a more reasonable setup. The mmu.library
  489.     will later on call AdjustCtxtSetting() on this context to give
  490.     you the chance to make some adjustments on the MMU setup.
  491.  
  492.     
  493.     DefineMMUContext( config, ctxt, mmubase);
  494.                 a0       a5       a6
  495.  
  496.     void DefineMMUConfig( struct MMUConfig *, struct IMMUContext *, 
  497.                   struct MMUBase *);
  498.  
  499.     BUGS
  500.  
  501.     SEE ALSO
  502.     AdjustCtxtSetting(), mmu/RemapSize(), mmu/context.h,
  503.     mmu/config.h
  504. mmu.resource/AdjustMMUContext            mmu.resource/AdjustMMUContext
  505.  
  506.     NAME
  507.     AdjustMMUContext() - integrate user supplied page layout settings into
  508.                  an IMMUContext
  509.  
  510.     SYNOPSIS
  511.     errcode = AdjustMMUContext( depth, destctxt, parent , mmubase );
  512.       d0                 d0     a0    a1    a6
  513.  
  514.     LONG AdjustMMUContext( LONG depth, struct MMUContext *,
  515.                    struct IMMUContext *, struct IMMUBase *);
  516.  
  517.     FUNCTION
  518.     This function gets called on CreateMMUContextA() to integrate
  519.     the user supplied page model into the context, given a parent/
  520.     template context to take default settings from. This function
  521.     shall try to find a possible page configuration fit for the user
  522.     supplied data within the destctxt, or shall fail if it is not 
  523.     possible to generate the user defined page layout.
  524.  
  525.     INPUTS
  526.     depth - depth of the MMU tree in levels, or negative if not
  527.         specified by the user. Then, this function shall use
  528.         the default depth from the "parent" context.
  529.     destctxt - destination context to generate a page layout for;
  530.         specifically, the destctxt->ctx_LevelABits to
  531.         destctxt->ctx_PageBits must be defined. Initially,
  532.         these are either filled with the user-specified values,
  533.         or 0xff for "default values". It is the job of this
  534.         function to fill all the components of the IMMUContext
  535.         that are set to 0xff such that the page layout is
  536.         supported by the hardware and as close as possible to
  537.         that of the parent. Ideally, the parent configuration
  538.         should be used to allow minor context switches between
  539.         the parent and this context. If possible, at least the
  540.         page size of parent and destctxt should be made identically,
  541.         unless the user tries to setup its own page size.
  542.     parent - struct IMMUContext to take default settings from.
  543.     mmubase - library base pointer of the mmu.library
  544.  
  545.     RESULTS
  546.     An error code or zero on success. The following error codes shall
  547.     be used:
  548.  
  549.     CCERR_INVALID_PARAMETERS    the parameters make no sense, as
  550.                     for example the sum of all level and
  551.                     page bits is not 32.
  552.  
  553.     CCERR_UNSUPPORTED        the parameters are consistent, but not
  554.                     supported by the MMU hardware.
  555.  
  556.     NOTES
  557.     Note that a6 points to the mmu.library base, not to the resource
  558.     base.
  559.  
  560.     BUGS
  561.  
  562.     SEE ALSO
  563.     mmu/context.h, mmu/CreateMMUContextA()
  564. mmu.resource/ParseTT                    mmu.resource/ParseTT
  565.  
  566.     NAME
  567.     ParseTT() - integrate the transparent translation registers into
  568.             the MMU table layout.
  569.  
  570.     SYNOPSIS
  571.     ok = ParseTT( ctxt, config, mmubase);
  572.     d0        a0    a1    a6
  573.  
  574.     BOOL ParseTT( struct IMMUContext *, struct MMUConfig *, struct MMUBase *);
  575.  
  576.     FUNCTION
  577.     Parses the transparent translation registers given by the MMUConfig
  578.     and integrates the definitions made by the TTx registers into the
  579.     MMU setup defined by the ctxt. The attempt of this function is to
  580.     get rid of the TTx definitions and mimic their function by placing
  581.     similar page definition data into the MMU table of the context.
  582.  
  583.     INPUTS
  584.     ctxt -    the IMMUContext into which the TTx registers shall be integrated.
  585.         Especially, the following flags in ctxt->ctx_Flags should be
  586.         considered:
  587.  
  588.         CTXF_CLEARDTT0        Is set on entry if the DTT0 register
  589.                     shall be ignored. 
  590.  
  591.         This flag gets set by the mmu.library on startup if the 
  592.         ENVARC:MMU-Configuration contains the "ClearTTx" command.
  593.  
  594.         On exit, this flag shall be set in case the DTT0 setup could
  595.         be successfully integrated into the MMU table of ctxt.
  596.  
  597.         CTXF_CLEARDTT1, CTXF_CLEARITT0, CTXF_CLEARITT1
  598.  
  599.         similar.
  600.  
  601.     config - struct MMUConfig containing the current setup of the TTx
  602.         registers that are about to be integrated.
  603.  
  604.     mmubase - pointer to the mmu.library base
  605.  
  606.     RESULTS
  607.     a boolean success/failure indicator.
  608.  
  609.     NOTES
  610.     Note that a6 points to the mmu.library base, not to the resource
  611.     base.
  612.  
  613.     This function might require the help of two internal mmu.library
  614.     functions that are hereby documented purely for the use of the
  615.     mmu.resource:
  616.  
  617.     ok = AddTransparentTranslation( ctxt, amask, props, propmask );
  618.     d0                 a5    a1     d0    d1
  619.  
  620.     BOOL AddTransparentTranslation( struct IMMUContext *, UWORD,
  621.                     ULONG, ULONG );
  622.  
  623.     ok = OrTransparentTranslation( ctxt, amask, props, propmask );
  624.  
  625.     BOOL OrTransparentTranslation(    struct IMMUContext *, UWORD,
  626.                     ULONG, ULONG );
  627.  
  628.     Both functions work very much the like with the difference that
  629.     the first attempts to insert all TTx properties into the context,
  630.     whereas the second uses the most conservative setting when the
  631.     old context definition and the TTx definition conflict.
  632.  
  633.     Arguments of these calls are as follows:
  634.  
  635.     ctxt    -    MMUContext to integrate TTx settings into
  636.     amask    -    an address and address mask. The lower 8 bits
  637.             of amask define a mask, the upper 8 an address.
  638.  
  639.     The address mask is interpreted as bits 31..24 of a full mask,
  640.     where a one-bit indicates that the corresponding address bit is
  641.     ignored on address comparison. Bits 23..0 are always understood
  642.     to be one, i.e. are always ignored. Hence, TTx registers are
  643.     limited to define 16MB chunks of memory at once.
  644.  
  645.     The address bits define bits 31..24 of an address to compare
  646.     against.
  647.  
  648.     The code will, therefore, perform the following operation:
  649.  
  650.     if (((address>>24)^(amask >> 8)) & (~amask & 0xff) == 0) {
  651.         /* modify context */
  652.     }
  653.  
  654.     If the above comparison is true, the mmu.library will modify
  655.     the 16MB segment starting at "address" by means of the propmask
  656.     and the props arguments. "props" defines the new values of the
  657.     property flags, "propmask" which property bits are to be
  658.     altered.
  659.  
  660.     BUGS
  661.  
  662.     SEE ALSO
  663.     mmu/context.h
  664. mmu.resource/RootStarter                  mmu.resource/RootStarter
  665.  
  666.     NAME
  667.     RootStarter - get a pointer to the MMU root as abstract table 
  668.               descriptor
  669.  
  670.     SYNOPSIS
  671.     ok = RootStarter( config, atd, type, mmubase);
  672.     d0            a1       a0    d0   a6
  673.  
  674.     LONG RootStarter(struct MMUConfig *,struct AbstractDescriptor *,
  675.              UBYTE, struct MMUBase *);
  676.  
  677.     FUNCTION
  678.     Fills in the "AbstractDesctriptor" describing the location of the
  679.     MMU root table pointer. adt->adt_Pointer should be filled with
  680.     the address(!) of a memory location containing the user or
  681.     superivor root table pointer. This is typically the address of
  682.     one of the root pointer components within the MMUConfig passed
  683.     in.
  684.  
  685.     INPUTS
  686.     config    - struct MMUConfig containing the user and supervisor
  687.           root pointers.
  688.     atd -      AbstractDescriptor to be filled in. The following
  689.           fields must be provided:
  690.  
  691.         atd->atd_Pointer    pointer to the root pointer
  692.         atd->atd_LowerLimit    set to zero
  693.         atd->atd_UpperLimit    set to zero
  694.  
  695.         atd->atd_Type        set to ATDT_TABLE for short
  696.                     descriptors (four bytes), 
  697.                     ATDT_TABLE|ATDT_LONG for long
  698.                     descriptors (eight bytes)
  699.  
  700.     type -    0 if you need to provide the user root pointer, non-
  701.         zero otherwise. In case the MMU programming model described
  702.         by "config" does not distinguish between user and supervisor
  703.         access, ignore this type.
  704.  
  705.     mmubase - pointer to the mmu.library base.
  706.  
  707.     RESULTS
  708.     ok should be set to zero in case the MMU root could not be read.
  709.     In this case, the resource will have caused a guru already.
  710.     The result code shall be -1 in case the MMU is enabled and the
  711.     root could be read, and +1 in case the MMU is disabled. The
  712.     atd need not to be filled out in this case.
  713.  
  714.     NOTES
  715.     Note that a6 points to the mmu.library base, not to the resource
  716.     base.
  717.  
  718.     This function is used by the mmu.library to initiate the mmu table
  719.     scan of the active MMU configuration.
  720.  
  721.     BUGS
  722.  
  723.     SEE ALSO
  724.     ReadDescriptor(), mmu/config.h, mmu/descriptor.h
  725. mmu.resource/ReadDescriptor            mmu.resource/ReadDescriptor
  726.  
  727.     NAME
  728.     ReadDescriptor() - read and interpret an hardware MMU descriptor
  729.  
  730.     SYNOPSIS
  731.     ReadDescriptor( deptr, atd, type, level, ctxt, mmubase );
  732.               a1    a0    d0    d1     a5    a6
  733.  
  734.     ReadDescriptor( ULONG *, struct AbstractDescriptor *, UBYTE ,
  735.             UBYTE, struct IMMUContext *, struct MMUBase *);
  736.  
  737.     FUNCTION
  738.     Reads and interprets an MMU table/page descriptor pointed to by
  739.     deptr, and fills the abstraction data into the atd.
  740.  
  741.     INPUTS
  742.     deptr -    points to the descriptor to read.
  743.     atd -    the AbstractDescriptor to be filled in.
  744.     type -    type of the descriptor to be read. This has the bit
  745.         ATDB_LONG set for long descriptors. All other bits
  746.         shall be ignored.
  747.     level -    MMU table level to read the descriptor from. Zero
  748.         identifies level A, -1 is used in case this function
  749.         shall read and interpret the root pointer itself, as
  750.         supplied by RootStarter(). "deptr" points then to a
  751.         memory location containing(!) the root pointer.
  752.     ctxt -    struct IMMUContext this parsing is done within. The
  753.         IMMUContext provides all bitmasks to isolate property
  754.         bits and pointers from the descriptor, i.e. in 
  755.         ctxt->ctx_LevelAMask...ctxt->ctx_PageMask. Note that
  756.         the LevelAMask is required for reading pointers that
  757.         point to a level A table, i.e. the root pointer.
  758.     mmubase - pointer to the mmu.library base.
  759.  
  760.  
  761.     The AbstractDescriptor must be filled in as follows:
  762.  
  763.     atd->atd_Pointer    pointer to the next MMU descriptor table
  764.                 or the physical page address or the
  765.                 indirect descriptor.
  766.  
  767.     atd->atd_Properties    properties described by this descriptor.
  768.  
  769.  
  770.     atd->atd_LowerLimit    in case this is a long descriptor, the 
  771.                 lower page limit in case this descriptor
  772.                 uses a lower limit, or zero otherwise.
  773.  
  774.     atd->atd_UpperLimit    in case this descriptor is long and uses
  775.                 an upper page limit, fill this limit into
  776.                 here without the "upper limit signal bit".
  777.                 Otherwise, set to 0x7fff.
  778.  
  779.     atd->atd_ThisType    type of this descriptor. The following bits
  780.                 are available to signal the type:
  781.  
  782.         ATDB_TABLE    is a table descriptor
  783.         ATDB_INDIRECT    is an indirect descriptor
  784.         ATDB_PAGE    is a page descriptor
  785.                 (includes early termination descriptors)
  786.         ATDB_INVALID    is an invalid descriptor
  787.                 (set properties to MAPP_INVALID, too!)
  788.  
  789.     atd->atd_NextType    type of the descriptors this descriptor
  790.                 points to if this is a table or an invalid
  791.                 descriptor. The following bits should be
  792.                 set:
  793.  
  794.         ATDB_LONG    Descriptors in the table this descriptor
  795.                 points to are of long type (eight bytes)
  796.         ATDB_TABLE    This descriptor points to a table of new
  797.                 descriptors, possibly including page,
  798.                 indirect or invalid descriptors.
  799.         ATDT_INVALID    This descriptor doesn't point to a next
  800.                 descriptor because it is either a page
  801.                 descriptor, an early termination descriptor
  802.                 or invalid.
  803.  
  804.     RESULTS
  805.  
  806.     NOTES    
  807.     Note that a6 points to the mmu.library base, not to the resource
  808.     base.
  809.  
  810.     This function is used by the mmu.library to scan an already loaded
  811.     MMU table.
  812.  
  813.     BUGS
  814.     
  815.     SEE ALSO
  816.     RootStarter(), mmu/descriptor.h
  817. mmu.resource/ReadFastDescriptor            mmu.resource/ReadFastDescriptor
  818.  
  819.     NAME
  820.     ReadFastDescriptor() - read an MMU descriptor quickly.
  821.  
  822.     SYNOPSIS
  823.     ReadFastDescriptor( deptr, atd, type, level, ctxt, mmubase );
  824.                   a1    a0    d0    d1     a5    a6
  825.  
  826.     ReadFastDescriptor( ULONG *, struct AbstractDescriptor *, UBYTE ,
  827.                 UBYTE, struct IMMUContext *, struct MMUBase *);
  828.  
  829.     FUNCTION
  830.     Reads and interprets an MMU table/page descriptor pointed to by
  831.     deptr, and fills the abstraction data into the atd.
  832.  
  833.     This is similar to ReadDescriptor except that this function is
  834.     allowed to take some shortcuts. It is not assumed to fill in
  835.     any property flags or atd->atd_NextType, neither need it work
  836.     with long descriptors.
  837.  
  838.     INPUTS
  839.     deptr -    points to the descriptor to read.
  840.     atd -    the AbstractDescriptor to be filled in.
  841.     type -    type of the descriptor to be read. This has the bit
  842.         ATDB_LONG set for long descriptors. All other bits
  843.         shall be ignored.
  844.     level -    MMU table level to read the descriptor from. Zero
  845.         identifies level A, -1 is used in case this function
  846.         shall read and interpret the root pointer itself, as
  847.         supplied by RootStarter(). "deptr" points then to a
  848.         memory location containing(!) the root pointer.
  849.     ctxt -    struct IMMUContext this parsing is done within. The
  850.         IMMUContext provides all bitmasks to isolate property
  851.         bits and pointers from the descriptor, i.e. in 
  852.         ctxt->ctx_LevelAMask...ctxt->ctx_PageMask. Note that
  853.         the LevelAMask is required for reading pointers that
  854.         point to a level A table, i.e. the root pointer.
  855.     mmubase - pointer to the mmu.library base.
  856.  
  857.  
  858.     See ReadDescriptor() for further details.
  859.  
  860.     RESULTS
  861.  
  862.     NOTES    
  863.     Note that a6 points to the mmu.library base, not to the resource
  864.     base.
  865.  
  866.     This streamlined version is used by the mmu.library as soon as
  867.     it knows that it works on tables it build itself.
  868.  
  869.     BUGS
  870.     
  871.     SEE ALSO
  872.     ReadDescriptor(), mmu/descriptor.h
  873. mmu.resource/CmpDescriptor            mmu.resource/CmpDescriptor
  874.  
  875.     NAME
  876.     CmpDescriptor() - compare two descriptors by an offset
  877.  
  878.     SYNOPSIS
  879.     iseq = CmpDescriptor( descr1 , descr2 , type, delta, mmubase);
  880.     ccr            a0    a1     d0    d1    a6
  881.  
  882.     void CmpDescriptor( ULONG *, ULONG *, UBYTE, ULONG, struct MMUBase *);
  883.  
  884.     FUNCTION
  885.     Compares whether descriptor one is equal to the descriptor up to an
  886.     address displacement delta.
  887.  
  888.     Hence, if both descriptors are page descriptors, the call checks
  889.     whether the destination page of descr1 equals the destination page
  890.     of descr2 minus delta, and whether the properties are identically up
  891.     to the MAPP_USED and MAPP_MODIFIED bits.
  892.  
  893.     If both descriptors are indirect, the call checks whether they point
  894.     both to the same target descriptor.
  895.  
  896.     If both descriptors are invalid, they are always considered equal.
  897.  
  898.     INPUTS
  899.     descr1    - the base descriptor to compare against
  900.     descr2    - the descriptor that it is compared with.
  901.     type    - has ATDT_LONG set for long descriptors, otherwise 
  902.           descr1 and descr2 point to short descriptors.
  903.           has ATDT_INDIRECT set for indirect descriptors.
  904.  
  905.     delta   - address displacement of descr2 relative to descr1.
  906.     mmubase - base address of the mmu.library
  907.  
  908.     RESULTS
  909.     This call returns its result in the condition code register and is
  910.     hence not callable from C; note that it is not supposed to be called
  911.     by anything but the mmu.library anyhow.
  912.  
  913.     It sets the condition code register Z flag if the descriptors are
  914.     considered to be equal, otherwise Z is cleared.
  915.  
  916.     Register a0 must not be touched by this call, and register a1 must
  917.     be advanced by one descriptor, i.e. either four or eight bytes,
  918.     depending on whether the descriptor is long or short.
  919.  
  920.     This strange syntax was chosen to make the call as fast as possible
  921.     and hence to speed up the MMU table scanner.
  922.  
  923.     NOTES
  924.     Note that a6 points to the mmu.library base, not to the resource
  925.     base.
  926.  
  927.     This call is used by the mmu.library internal MMU table parser to
  928.     detect continously mapped memory blocks. It shall execute as fast
  929.     as possible.
  930.  
  931.     BUGS
  932.     The calling syntax is ugly.
  933.  
  934.     SEE ALSO
  935.     ReadDescriptor()
  936. mmu.resource/IncrementDescriptor        mmu.resource/IncrementDescriptor
  937.  
  938.     NAME
  939.     IncrementDescriptor() - advance a pointer into an MMU descriptor table
  940.                 and provide an increment
  941.  
  942.     SYNOPSIS
  943.     increment = IncrementDescriptor( atd, index, mmubase );
  944.     d0                  a0    d0    a6
  945.  
  946.     ULONG IncrementDescriptor( struct AbstractDescriptor *, ULONG, 
  947.                    struct MMUBase *);
  948.  
  949.     FUNCTION
  950.     Checks atd->atd_NextType and returns the increment required to
  951.     get to the next descriptor; further, loads a pointer at the
  952.     descriptor within the descriptor table pointed to by atd->atd_Pointer.
  953.  
  954.     INPUTS
  955.     atd -    an abstract descriptor describing the start of the descriptor
  956.         table and the type of descriptors within this table.
  957.  
  958.         atd->atd_NextType is used to check whether short or long
  959.         descriptors are found within this table,
  960.  
  961.         atd->atd_Pointer is assumed to be the base pointer to a
  962.         descriptor table of descriptors of type atd->atd_NextType.
  963.  
  964.     index -    the index of the descriptor within the table pointed to by
  965.         atd->atd_Pointer to provide as secondary output.
  966.  
  967.     mmubase - pointer to the mmu.library base.
  968.  
  969.     RESULTS
  970.     increment - the byte increment to get from one descriptor within the
  971.             table atd->atd_Pointer points to to the next one. This
  972.             is typically four for short and eight for long descriptors.
  973.  
  974.     a0 contains a secondary result that is not useable from C (but note
  975.     that this function must not be called by anything but the mmu.library
  976.     anyhow), namely the address of the descriptor within the table at
  977.     the table entry given by index.
  978.  
  979.     NOTES
  980.     Note that a6 points to the mmu.library base, not to the resource
  981.     base.
  982.  
  983.     This call is used by the mmu.library internal MMU table parser to
  984.     advance by a table descriptor and to pick a descriptor from a
  985.     table.
  986.  
  987.     BUGS
  988.     The calling convention is ugly.
  989.  
  990.     SEE ALSO
  991.     CmpDescriptor()
  992. mmu.resource/WriteDescriptor            mmu.resource/WriteDescriptor
  993.  
  994.     NAME
  995.     WriteDescriptor() - build a hardware MMU table descriptor from an
  996.                 abstract table descriptor.
  997.  
  998.     SYNOPSIS
  999.     descr = WriteDescriptor( atd, level, ctxt, mmubase );
  1000.     d0             a0    d1    a5     a6
  1001.  
  1002.     ULONG WriteDescriptor(    struct AbstractDescriptor *a0, WORD level, 
  1003.                 struct IMMUContext *, struct MMUBase *);
  1004.  
  1005.     FUNCTION
  1006.     Builds a hardware MMU table descriptor from an abstract description
  1007.     for a given level of the MMU tree.
  1008.  
  1009.     INPUTS
  1010.     atd -    AbstractDescriptor providing the information concerning the
  1011.         descriptor type to build. The following components are
  1012.         relevant:
  1013.  
  1014.         atd->atd_Pointer:    Either the address of the next
  1015.                     descriptor table for table 
  1016.                     descriptors, or the physical address
  1017.                     for page descriptors, or the address
  1018.                     of the destination descriptor for
  1019.                     indirect descriptors, or the
  1020.                     descriptor contents for invalid
  1021.                     descriptors; in the last case, several
  1022.                     bits of the pointer will be masked
  1023.                     out, as they are required to signal an
  1024.                     indirect descriptor type.
  1025.         atd->atd_Properties:    Properties of the descriptor to be
  1026.                     build. MAPP_INVALID or MAPP_SWAPPED 
  1027.                     signals that an    invalid descriptor
  1028.                     shall be build, MAPP_INDIRECT signals
  1029.                     an indirect descriptor.
  1030.         atd->atd_LowerLimit:    ignored, only short descriptors are
  1031.                     supported
  1032.         atd->atd_UpperLimit:    ignored for the same reason.
  1033.         atd->atd_ThisType:    Descriptor type to build. This must 
  1034.                     have the ATDB_LONG bit cleared. The
  1035.                     following types are supported:
  1036.  
  1037.             ATDT_INVALID    Build an invalid descriptor, as if
  1038.                     MAPP_INVALID or MAPP_SWAPPED has been
  1039.                     set. Descriptor contents is within
  1040.                     atd->atd_Pointer.
  1041.             ATDT_PAGE    Build a page descriptor or an early
  1042.                     termination page descriptor. This
  1043.                     reverts to indirect or invalid de-
  1044.                     scriptors if the corresponding
  1045.                     property flags are set. The physical
  1046.                     page address is in atd->atd_Pointer.
  1047.                     In case MAPP_INVALID or MAPP_SWAPPED
  1048.                     are set, atd_Pointer contains the
  1049.                     data for the invalid descriptor.
  1050.                     In case MAPP_INDIRECT is set, the
  1051.                     atd_Pointer contains the address of
  1052.                     the target descriptor.
  1053.             ATDT_TABLE    Build a table descriptor. atd_Pointer
  1054.                     points to the next descriptor table.
  1055.             ATDT_INDIRECT    This value is not allowed. Instead,
  1056.                     indirect descriptors must be build by
  1057.                     MAPP_PAGE and properties of 
  1058.                     MAPP_INDIRECT.
  1059.  
  1060.         atd->atd_NextType    ingored.
  1061.  
  1062.     level - level at which the descriptor shall be build. Level = 0 
  1063.         indicates level A of the MMU tree, level = -1 indicates that
  1064.         a root descriptor shall be build.
  1065.  
  1066.     ctxt -     pointer to the IMMUContext the descriptor will be part of.
  1067.  
  1068.     mmubase - pointer to the MMU library base.
  1069.  
  1070.     RESULTS
  1071.     descr - the generated descriptor. Note that 0L need not to indicate
  1072.     an error.
  1073.  
  1074.     Error conditions are delivered by means of the Z bit of the CCR
  1075.     register. If the Z bit is one, the requested descriptor could not be
  1076.     build. This happens for example if a descriptor of type ATDT_PAGE
  1077.     shall be build at non-page level and the MMU does not support early
  1078.     termination descriptors. If everything is fine, the Z bit will be
  1079.     cleared.
  1080.  
  1081.     NOTES
  1082.     Note that a6 points to the mmu.library base, not to the resource
  1083.     base.
  1084.  
  1085.     Note that the usage of the abstract descriptor is slightly different
  1086.     from that of ReadDescriptor(). ReadDescriptor() delivers a descriptor
  1087.     type of ATDT_INDIRECT for indirect descriptors, whereas
  1088.     WriteDescriptor() expects ATDT_PAGE with properties set to
  1089.     MAPP_INDIRECT to build this descriptor type.
  1090.  
  1091.     This call is used by the mmu.library table build algorithm to generate
  1092.     new descriptors.
  1093.  
  1094.     BUGS
  1095.     The name is misleading, GenerateDescriptor() would fit better as
  1096.     this function never writes any descriptor out to memory.
  1097.     The calling syntax is non-standard and ugly.
  1098.  
  1099.     SEE ALSO
  1100.     ReadDescriptor(), mmu/descriptor.h
  1101. mmu.resource/FindDescriptor            mmu.resource/FindDescriptor
  1102.  
  1103.     NAME
  1104.     FindDescriptor() - find an MMU descriptor by logical address.
  1105.  
  1106.     SYNOPSIS
  1107.     level = FindDescriptor( addr, ctxt , mmubase );
  1108.     d0             a0     a5    a6
  1109.  
  1110.     WORD FindDescriptor( ULONG, struct IMMUContext *, struct MMUBase *);
  1111.  
  1112.     FUNCTION
  1113.     This function scans the MMU tables to detect the descriptor that
  1114.     is responsible for translating the logical address to a physical
  1115.     address. This descriptor address is returned as secondary result
  1116.     code in register a0.
  1117.     For indirect descriptors, this function returns the address
  1118.     of the descriptor pointing to the target descriptor, and not the
  1119.     descriptor itself.
  1120.     The primary result code is the level at which the descriptor
  1121.     was found. Zero indicates a descriptor at level A of the MMU
  1122.     table.
  1123.  
  1124.     INPUTS
  1125.     addr - logical address whose descriptor shall be found.
  1126.     ctxt - IMMUContext managing this descriptor.
  1127.     mmubase - pointer to the mmu.library base.
  1128.  
  1129.     RESULTS
  1130.     level - page level the descriptor has been found at. This need
  1131.         not to be the page level as invalid or early termination
  1132.         descriptor might abort a table search earlier.
  1133.  
  1134.     A secondary result is returned in register a0; this is the address
  1135.     of the descriptor translating the logical address; for indirect
  1136.     descriptors, this is not the final target descriptor, but the
  1137.     indirect descriptor pointing to the final target.
  1138.  
  1139.     NOTES
  1140.     Note that a6 points to the mmu.library base, not to the resource
  1141.     base.
  1142.  
  1143.     This is always called from supervisor mode; do not attempt to call
  1144.     it from user mode.
  1145.  
  1146.     This call has to read MMU descriptors for obvious reasons. As the
  1147.     mmu.library does not necessarely place these in non-cacheable memory,
  1148.     your code must keep care to push the descriptors back to memory as
  1149.     soon as they have been read. Not following this advice may either
  1150.     cause inconsistent MMU mapping or - even worse - hangs of the MMU.
  1151.  
  1152.     BUGS
  1153.     The calling syntax is ugly.
  1154.  
  1155.     SEE ALSO
  1156.  
  1157. mmu.resource/PFlush                    mmu.resource/PFlush
  1158.  
  1159.     NAME
  1160.     PFLush()    -    flush ATC entries for a given logical address
  1161.  
  1162.     SYNOPSIS
  1163.     PFlush( addr, mmubase );
  1164.          a0    a6
  1165.  
  1166.     void PFlush( ULONG, struct MMUBase * );
  1167.  
  1168.     FUNCTION
  1169.     Flushes the ATC entry for the descriptor describing the mapping
  1170.     of the passed in logical address.
  1171.  
  1172.     INPUTS
  1173.     addr - logical address whose descriptor needs to be flushed.
  1174.     mmubase - base pointer of the mmu.library
  1175.  
  1176.     RESULTS
  1177.  
  1178.     NOTES
  1179.     Note that a6 points to the mmu.library base, not to the resource
  1180.     base.
  1181.  
  1182.     This is always called from supervisor mode; do not attempt to call
  1183.     it from user mode.
  1184.  
  1185.     Since the mmu.library enforces a separate user/supervisor model,
  1186.     this call must flush the ATC entries for both, user and supervisor
  1187.     tree.
  1188.  
  1189.     Note further that early termination descriptors take up more than
  1190.     one ATC entry. Hence, this call flushes a descriptor for one page,
  1191.     but not necessarely for all pages it describes.
  1192.  
  1193.     BUGS
  1194.  
  1195.     SEE ALSO
  1196.     PFlushA(), PFlushTwo()
  1197. mmu.resource/PFlushA                    mmu.resource/PFlushA
  1198.  
  1199.     NAME
  1200.     PFlushA()    -    flush the address translation cache completely
  1201.  
  1202.     SYNOPSIS
  1203.     PFlushA( mmubase );
  1204.            a6
  1205.  
  1206.     void PFlushA( struct MMUBase *);
  1207.  
  1208.     FUNCTION
  1209.     Flushes the address translation cache of the MMU completely.
  1210.  
  1211.     INPUTS
  1212.     mmubase - library base pointer of the mmu.library
  1213.  
  1214.     RESULTS
  1215.  
  1216.     NOTES
  1217.     Note that a6 points to the mmu.library base, not to the resource
  1218.     base.
  1219.  
  1220.     This is always called from supervisor mode; do not attempt to call
  1221.     it from user mode.
  1222.  
  1223.     BUGS
  1224.  
  1225.     SEE ALSO
  1226.     PFlush(), PFlushTwo()
  1227. mmu.resource/PFlushTwo                    mmu.resource/PFlushTwo
  1228.  
  1229.     NAME
  1230.     PFlushTwo()    -    flush two descriptors from the ATC
  1231.  
  1232.     SYNOPSIS
  1233.     PFlushTwo( addr1, addr2, mmubase);
  1234.            a2    a3    a6
  1235.  
  1236.     void PFlushTwo( ULONG, ULONG, struct MMUBase * );
  1237.               a2     a3        a6
  1238.  
  1239.     FUNCTION
  1240.     Flushes two descriptors from the MMU address translation cache by
  1241.     the logical addresses they describe.
  1242.  
  1243.     INPUTS
  1244.     addr1    -    first logical address whose descriptor shall be
  1245.             flushed,
  1246.     addr2    -    second logical address to be flushed
  1247.     mmubase    -    base pointer to the mmu.library
  1248.  
  1249.     RESULTS
  1250.  
  1251.     NOTES
  1252.     Note that a6 points to the mmu.library base, not to the resource
  1253.     base.
  1254.  
  1255.     This is always called from supervisor mode; do not attempt to call
  1256.     it from user mode.
  1257.  
  1258.     Since the mmu.library enforces a separate user/supervisor model,
  1259.     this call must flush the ATC entries for both, user and supervisor
  1260.     tree.
  1261.  
  1262.     Note further that early termination descriptors take up more than
  1263.     one ATC entry. Hence, this call flushes a descriptor for one page,
  1264.     but not necessarely for all pages it describes.
  1265.  
  1266.     This call does not flush an address range, but really only two
  1267.     descriptors; this call is used to speed-up the CachePreDMA() and
  1268.     CachePostDMA() function patches. Otherwise, it is completely
  1269.     equivalent to calling PFlush() twice with addr1 and addr2 as
  1270.     arguments, respectively.
  1271.  
  1272.     BUGS
  1273.     
  1274.     SEE ALSO
  1275.     PFlush(), PFlushA()
  1276. mmu.resource/PushLine                    mmu.resource/PushLine
  1277.  
  1278.     NAME
  1279.     PushLine()    -    push a cache line back to memory
  1280.  
  1281.     SYNOPSIS
  1282.     PushLine( addr, mmubase );
  1283.            a0      a6
  1284.  
  1285.     void PushLine( ULONG, struct MMUBase * );
  1286.  
  1287.     FUNCTION
  1288.     Pushes the cache line containing the logical address *a0 back
  1289.     to memory. Hence, the sixteen-byte block containing the passed
  1290.     in address will be written out from the cache into memory, if
  1291.     the corresponding cache line is dirty. The cache line is then
  1292.     marked as "flushed" and non-valid.
  1293.  
  1294.     INPUTS
  1295.     addr -     the logical address contained in the cache line to be
  1296.         pushed.
  1297.     mmubase - base pointer to the mmu.library base.
  1298.  
  1299.     RESULTS
  1300.  
  1301.     NOTES
  1302.     Note that a6 points to the mmu.library base, not to the resource
  1303.     base.
  1304.  
  1305.     This is always called from supervisor mode; do not attempt to call
  1306.     it from user mode.
  1307.  
  1308.     Depending on the cache, this call might require to push more than
  1309.     just a line; it might also flush the cache completely if this is
  1310.     more efficient. This call pushes the data cache, and flushes the
  1311.     instruction cache; hence, it operates on all available caches.
  1312.  
  1313.     BUGS
  1314.  
  1315.     SEE ALSO
  1316.     PushPage(), PushAll(), PushTwo()
  1317. mmu.resource/PushPage                    mmu.resource/PushPage
  1318.  
  1319.     NAME
  1320.     PushPage()    -    push a MMU page back to memory
  1321.  
  1322.     SYNOPSIS
  1323.     PushPage( addr, mmubase );
  1324.            a0      a6
  1325.  
  1326.     void PushPage( ULONG, struct MMUBase * );
  1327.  
  1328.     FUNCTION
  1329.     Pushes the page containing the logical address *a0 back to 
  1330.     memory. Hence, the memory page containing the passed in address
  1331.     will be written out from the cache into memory, if the
  1332.     corresponding cache line is dirty. The cache lines are then marked 
  1333.     as "flushed" and non-valid.
  1334.  
  1335.     INPUTS
  1336.     addr -     the logical address contained in the page to be    pushed.
  1337.     mmubase - base pointer to the mmu.library base.
  1338.  
  1339.     RESULTS
  1340.  
  1341.     NOTES
  1342.     Note that a6 points to the mmu.library base, not to the resource
  1343.     base.
  1344.  
  1345.     This is always called from supervisor mode; do not attempt to call
  1346.     it from user mode.
  1347.  
  1348.     Depending on the cache, this call might require to push more than
  1349.     just a page; it might also flush the cache completely if this is
  1350.     more efficient. This call pushes the data cache, and flushes the
  1351.     instruction cache; hence, it operates on all available caches.
  1352.  
  1353.     BUGS
  1354.     Due to a hardware bug of the 68060, this call might not    flush
  1355.     the instruction cache as indicated if the address is not
  1356.     aligned to a page boundary. Hence, you are adviced to align
  1357.     the address before calling this as the mmu.resource does not
  1358.     try to work around this bug.
  1359.  
  1360.     SEE ALSO
  1361.     PushLine(), PushAll(), PushTwo()
  1362. mmu.resource/PushAll                    mmu.resource/PushAll
  1363.  
  1364.     NAME
  1365.     PushAll()    -    push and flush all caches completely
  1366.  
  1367.     SYNOPSIS
  1368.     PushAll( mmubase );
  1369.             a6
  1370.  
  1371.     void PushAll( struct MMUBase * );
  1372.  
  1373.     FUNCTION
  1374.     Pushes the data cache completely back to memory, and flushes
  1375.     the data and instruction cache completely.
  1376.  
  1377.     INPUTS
  1378.     mmubase - base pointer to the mmu.library base.
  1379.  
  1380.     RESULTS
  1381.  
  1382.     NOTES
  1383.     Note that a6 points to the mmu.library base, not to the resource
  1384.     base.
  1385.  
  1386.     This is always called from supervisor mode; do not attempt to call
  1387.     it from user mode.
  1388.  
  1389.     BUGS
  1390.  
  1391.     SEE ALSO
  1392.     PushLine(), PushPage(), PushTwo(), exec/CacheClearU()
  1393. mmu.resource/PushTwo                    mmu.resource/PushTwo
  1394.  
  1395.     NAME
  1396.     PushTwo()    -    push two pages of the data cache
  1397.  
  1398.     SYNOPSIS
  1399.     PushTwo( addr1, addr2, mmubase );
  1400.           a2     a3     a6
  1401.  
  1402.     void PushTwo( ULONG, ULONG, struct MMUBase * );
  1403.  
  1404.     FUNCTION
  1405.     Pushes the data cache entries for the pages containing the indicated
  1406.     logical addresses from out of cache.
  1407.  
  1408.     INPUTS
  1409.     addr1 -    first logical address contained in the first page to be
  1410.         pushed,
  1411.     addr2 -    second logical address of the page to be pushed
  1412.     mmubase - base pointer to the mmu.library
  1413.  
  1414.     RESULTS
  1415.  
  1416.     NOTES
  1417.     Note that a6 points to the mmu.library base, not to the resource
  1418.     base.
  1419.  
  1420.     This is always called from supervisor mode; do not attempt to call
  1421.     it from user mode.
  1422.  
  1423.     This call does not touch the instruction cache; its purpose is to
  1424.     prepare the edges of a memory block that is about to the transfered
  1425.     by DMA. This is called as part of the CachePreDMA() resp. 
  1426.     CachePostDMA() functions. Note that it doesn't push a range of pages,
  1427.     but really only to pages.
  1428.  
  1429.     BUGS
  1430.  
  1431.     SEE ALSO
  1432.     PushLine(), PushPage(), PushAll()
  1433. mmu.resource/ForbidDMACache            mmu.resource/ForbidDMACache
  1434.  
  1435.     NAME
  1436.     ForbidDMACache() - forbid caching of a page temporarly as long as an
  1437.                DMA transfer is running.
  1438.  
  1439.     SYNOPSIS
  1440.     ForbidDMACache( addr, ctxt, mmubase );
  1441.              a0    a5     a6
  1442.  
  1443.     void ForbidDMACache( ULONG, struct IMMUContext *, struct MMUBase *);
  1444.  
  1445.     FUNCTION
  1446.     Increments the DMA cache disable counter for the indicated page and
  1447.     sets the cache mode of the affected page to MAPP_WRITETRHOUGH until
  1448.     the matching PermitDMACache() is called. This call nests. Further,
  1449.     this call must be aware of the user selected page attributes.
  1450.  
  1451.     INPUTS
  1452.     addr -    a logical address contained in the page to be touched by a
  1453.         DMA transfer,
  1454.     ctxt -    a struct MMUContext describing the context the corresponding
  1455.         MMU tree is relative to.
  1456.     mmubase - library base of the mmu.library
  1457.  
  1458.     RESULTS
  1459.  
  1460.     NOTES
  1461.     Note that a6 points to the mmu.library base, not to the resource
  1462.     base.
  1463.  
  1464.     This is always called from supervisor mode; do not attempt to call
  1465.     it from user mode. This will be called with all interrupts disabled.
  1466.  
  1467.     This call must:
  1468.  
  1469.     - Find the page descriptor for the selected page,
  1470.     - push it back to memory in case someone read it (illegally, by-
  1471.       passing the mmu.library functions)
  1472.     - check the DMA disable counter for the corresponding page.
  1473.       The mmu.library generates the required counters for you in the
  1474.       following way: A page-level descriptor table of "N" entries
  1475.       generates four tables: Table one at offset zero contains the
  1476.       MMU hardware descriptor, table two at offset "N" contains the
  1477.       page properties the user selected for the page, or the
  1478.       "userdata" for invalid or swapped pages, table three at offset
  1479.       "2*N" contains the DMA disable counters. Table four is still un-
  1480.       used. 
  1481.       Hence, this call must find the page descriptor of the indicated
  1482.       page and the size of the page descriptor table. The long word
  1483.       at byte offset "tablesize * 8" from the page descriptor is the
  1484.       DMA activity counter, the long word at "tablesize * 4" the
  1485.       user data or the mapping properties.
  1486.     - if the DMA disable counter is still zero, and we found a page
  1487.       descriptor, disable the copyback flag if caching is enabled,
  1488.     - write the descriptor back to memory,
  1489.     - push the cache line containing the descriptor to ensure the
  1490.       MMU will find it.
  1491.  
  1492.     Note that this call will not work for early termination page
  1493.     descriptors, invalid, swapped or indirect descriptors. It need
  1494.     not to work for early termination since the only MMUs that implement
  1495.     them are the 68851 and 68030 whose CPUs do not offer a copyback
  1496.     cache and hence do not need this support function. Neither need it
  1497.     to support invalid or swapped pages since they cannot contain
  1498.     vital data for a DMA process; it does not support indirect
  1499.     descriptors since it wouldn't know how to reconstruct them if DMA
  1500.     is done. This is a documented side condition of DMA and indirect
  1501.     descriptors that must be kept care of. This function must not crash
  1502.     if these conditions are not met; it shall not touch the descriptors
  1503.     then, though.
  1504.  
  1505.     Note further that the context you get passed in need not to be
  1506.     the active context; in fact, this function is called with every
  1507.     available context as soon as a DMA operation is initiated by means
  1508.     of CachePreDMA() to ensure proper operation even on a context switch
  1509.     while DMA is active.
  1510.  
  1511.     This function does nothing in case the MMU does not support copyback,
  1512.     i.e. for the 68030 and 68851.
  1513.  
  1514.     BUGS
  1515.  
  1516.     SEE ALSO
  1517.     PermitDMACache(), exec/CachePreDMA()
  1518. mmu.resource/PermitDMACache            mmu.resource/PermitDMACache
  1519.  
  1520.     NAME
  1521.     PermitDMACache() - re-enable caching of a page if DMA done
  1522.  
  1523.     SYNOPSIS
  1524.     PermitDMACache( addr, ctxt, mmubase );
  1525.              a0    a5     a6
  1526.  
  1527.     void PermitDMACache( ULONG, struct IMMUContext *, struct MMUBase *);
  1528.  
  1529.     FUNCTION
  1530.     Decrements the DMA cache disable counter for the indicated page and
  1531.     restores the previously active caching mode if it reaches zero.
  1532.     This call nests. Further, this call must be aware of the user 
  1533.     selected page attributes.
  1534.  
  1535.     INPUTS
  1536.     addr -    a logical address contained in the page that was touched by a
  1537.         DMA transfer,
  1538.     ctxt -    a struct MMUContext describing the context the corresponding
  1539.         MMU tree is relative to.
  1540.     mmubase - library base of the mmu.library
  1541.  
  1542.     RESULTS
  1543.  
  1544.     NOTES
  1545.     Note that a6 points to the mmu.library base, not to the resource
  1546.     base.
  1547.  
  1548.     This is always called from supervisor mode; do not attempt to call
  1549.     it from user mode. This will be called with all interrupts disabled.
  1550.  
  1551.     This call must:
  1552.  
  1553.     - Find the page descriptor for the selected page,
  1554.     - check the DMA disable counter for the corresponding page.
  1555.       The mmu.library generates the required counters for you in the
  1556.       following way: A page-level descriptor table of "N" entries
  1557.       generates four tables: Table one at offset zero contains the
  1558.       MMU hardware descriptor, table two at offset "N" contains the
  1559.       page properties the user selected for the page, or the
  1560.       "userdata" for invalid or swapped pages, table three at offset
  1561.       "2*N" contains the DMA disable counters. Table four is still un-
  1562.       used. 
  1563.       Hence, this call must find the page descriptor of the indicated
  1564.       page and the size of the page descriptor table. The long word
  1565.       at byte offset "tablesize * 8" from the page descriptor is the
  1566.       DMA activity counter, the long word at "tablesize * 4" the
  1567.       user data or the mapping properties.
  1568.     - decrement the DMA disable counter; if it underruns, it shall
  1569.       be set back to zero to support faulty devices that report a
  1570.       DMA-done more than once.
  1571.     - if the DMA disable counter is zero, proceed as follows:
  1572.     - push the page descriptor back to memory in case someone touched
  1573.       it, bypassing the documented mmu.library functions,
  1574.     - check whether this descriptor is really a page descriptor or
  1575.       invalid or indirect,
  1576.     - if it is, check whether the user property flags at offset 
  1577.       "tablesize * 4" indicate copyback caching,
  1578.     - if so, re-enable the copyback cache.
  1579.     - push the descriptor back to memory so the MMU will find the
  1580.       proper descriptor
  1581.  
  1582.     Note that this call will not work for early termination page
  1583.     descriptors, invalid, swapped or indirect descriptors. It need
  1584.     not to work for early termination since the only MMUs that implement
  1585.     them are the 68851 and 68030 whose CPUs do not offer a copyback
  1586.     cache and hence do not need this support function. Neither need it
  1587.     to support invalid or swapped pages since they cannot contain
  1588.     vital data for a DMA process; it does not support indirect
  1589.     descriptors since it wouldn't know how to reconstruct them if DMA
  1590.     is done. This is a documented side condition of DMA and indirect
  1591.     descriptors that must be kept care of. This function must not crash
  1592.     if these conditions are not met; it shall not touch the descriptors
  1593.     then, though.
  1594.  
  1595.     Note further that the context you get passed in need not to be
  1596.     the active context; in fact, this function is called with every
  1597.     available context as soon as a DMA operation is terminated by means
  1598.     of CachePostDMA() to ensure proper operation even on a context switch
  1599.     while DMA is active.
  1600.  
  1601.     This function does nothing in case the MMU does not support copyback,
  1602.     i.e. for the 68030 and 68851.
  1603.  
  1604.     BUGS
  1605.  
  1606.     SEE ALSO
  1607.     ForbidDMACache(), exec/CachePostDMA()
  1608. mmu.resource/InstallPage            mmu.resource/InstallPage
  1609.  
  1610.     NAME
  1611.     InstallPage() - re-install a page descriptor into the MMU tree
  1612.  
  1613.     SYNOPSIS
  1614.     InstallPage( level, tablesize, dest, descr, data, addr, ctxt, mmubase);
  1615.                d2    d1    a2    d0     d4    a0    a5    a6
  1616.  
  1617.     void InstallPage( WORD, ULONG, ULONG *, ULONG, ULONG, ULONG,
  1618.               struct IMMUContext *, struct MMUBase *);
  1619.  
  1620.     FUNCTION
  1621.     Re-install a page descriptor into a MMU tree; keep care about DMA
  1622.     disable counters and carry the used/modified bits over from the last
  1623.     descriptor. Install or modify page data, adjust the context.
  1624.  
  1625.     INPUTS
  1626.     level    -    level of the MMU tree where the descriptor shall be
  1627.             installed. Zero is level A.
  1628.     tablesize -    size of the descriptor table at this level in entries
  1629.     dest    -    physical address where to install the descriptor to
  1630.     descr    -    the descriptor to install
  1631.     data    -    secondary page data to install
  1632.     addr    -    logical address that is described by this descriptor
  1633.     ctxt    -    struct IMMUContext this descriptor is part of
  1634.     mmubase    -    library base pointer of the mmu.library
  1635.  
  1636.     RESULTS
  1637.  
  1638.     NOTES
  1639.     Note that a6 points to the mmu.library base, not to the resource
  1640.     base.
  1641.  
  1642.     This is always called from supervisor mode; do not attempt to call
  1643.     it from user mode. This will be called with all interrupts disabled.
  1644.  
  1645.     This call must:
  1646.  
  1647.     - check whether we need to install at page level; if so, DMA disable
  1648.       counters are available at byte offset "tablesize * 8" from the
  1649.       descriptor destination address "dest".
  1650.     - if the DMA counter is found active, the descriptor is found to be
  1651.       a valid page descriptor with copyback enabled, copyback must be
  1652.       disabled. This is required for proper support of ForbidDMACache()
  1653.       as the user may want to install a descriptor while a DMA operation
  1654.       is running on the same page.
  1655.     - secondary page data must be written to byte offset "tablesize * 4"
  1656.       from "dest". This page data consists either of the "property flags"
  1657.       if the page descriptor is valid or indirect, or on the "user data"
  1658.       for invalid or swapped non-repairable pages.
  1659.     - check again whether the descriptor is a valid page descriptor;
  1660.     - if so, check the type of the old descriptor; if it is a page 
  1661.       descriptor, too, carry its USED/MODIFIED bits over to the new
  1662.       descriptor. If it is a table descriptor, carry its MODIFIED bit
  1663.       over. This step is required to keep the U/M bits consistent in case
  1664.       the user wants to install a new descriptor while pages haven't been
  1665.       swapped out/read out yet.
  1666.     - write the new descriptor back to memory.
  1667.     - push the cache line containing the new descriptor so the MMU will
  1668.       really find it.
  1669.     - check whether the logical address that is maintained by this
  1670.       descriptor is the zero-page; if so, the descriptor address must be
  1671.       placed in ctxt->ctx_ZeroPage for the exception handler
  1672.  
  1673.     Note that the context you get passed in need not to be the active
  1674.     context.
  1675.     
  1676.     Note further that this call expects a valid page descriptor active
  1677.     already; in case you want to install a page descriptor into a not
  1678.     yet valid array of descriptors, use InstallNewPage() instead.
  1679.  
  1680.     BUGS
  1681.  
  1682.     SEE ALSO
  1683.     InstallNewPage(), ForbidDMACache()
  1684. mmu.resource/InstallNewPage            mmu.resource/InstallNewPage
  1685.  
  1686.     NAME
  1687.     InstallNewPage() - Install a page descriptor into the MMU tree
  1688.  
  1689.     SYNOPSIS
  1690.     InstallNewPage( level, tablesize, dest, descr, data, addr, ctxt, mmubase);
  1691.              d2       d1       a2    d0     d4    a0    a5    a6
  1692.  
  1693.     void InstallNewPage( WORD, ULONG, ULONG *, ULONG, ULONG, ULONG,
  1694.               struct IMMUContext *, struct MMUBase *);
  1695.  
  1696.     FUNCTION
  1697.     Install a page descriptor into a MMU tree; keep care about DMA
  1698.     disable counters. Install new page data, adjust the context.
  1699.  
  1700.     INPUTS
  1701.     level    -    level of the MMU tree where the descriptor shall be
  1702.             installed. Zero is level A.
  1703.     tablesize -    size of the descriptor table at this level in entries
  1704.     dest    -    physical address where to install the descriptor to
  1705.     descr    -    the descriptor to install
  1706.     data    -    secondary page data to install
  1707.     addr    -    logical address that is described by this descriptor
  1708.     ctxt    -    struct IMMUContext this descriptor is part of
  1709.     mmubase    -    library base pointer of the mmu.library
  1710.  
  1711.     RESULTS
  1712.  
  1713.     NOTES
  1714.     Note that a6 points to the mmu.library base, not to the resource
  1715.     base.
  1716.  
  1717.     This is always called from supervisor mode; do not attempt to call
  1718.     it from user mode. This will be called with all interrupts disabled.
  1719.  
  1720.     This call must:
  1721.  
  1722.     - check whether we need to install at page level; if so, DMA disable
  1723.       counters are available at byte offset "tablesize * 8" from the
  1724.       descriptor destination address "dest".
  1725.     - if the DMA counter is found active, the descriptor is found to be
  1726.       a valid page descriptor with copyback enabled, copyback must be
  1727.       disabled. This is required for proper support of ForbidDMACache()
  1728.       as the user may want to install a descriptor while a DMA operation
  1729.       is running on the same page.
  1730.     - secondary page data must be written to byte offset "tablesize * 4"
  1731.       from "dest". This page data consists either of the "property flags"
  1732.       if the page descriptor is valid or indirect, or on the "user data"
  1733.       for invalid or swapped non-repairable pages.
  1734.     - write the new descriptor back to memory.
  1735.     - push the cache line containing the new descriptor so the MMU will
  1736.       really find it.
  1737.     - check whether the logical address that is maintained by this
  1738.       descriptor is the zero-page; if so, the descriptor address must be
  1739.       placed in ctxt->ctx_ZeroPage for the exception handler
  1740.  
  1741.     Note that the context you get passed in need not to be the active
  1742.     context.
  1743.  
  1744.     This call does not make any assumptions about the contents of
  1745.     "dest"; therefore, it does not try to carry over the USED/MODIFIED
  1746.     bits from there and their contents will be lost resp. replaced by
  1747.     the contents of the new descriptor. Do not use this call in case
  1748.     you want to replace an already active page descriptor, consider
  1749.     InstallPage() instead.
  1750.  
  1751.     BUGS
  1752.  
  1753.     SEE ALSO
  1754.     InstallPage(), ForbidDMACache()
  1755. mmu.resource/ReadUMFlags                mmu.resource/ReadUMFlags
  1756.  
  1757.     NAME
  1758.     ReadUMFlags() - read and reset the USED/MODIFIED flags
  1759.  
  1760.     SYNOPSIS
  1761.     flags = ReadUMFlags( descr, level, ctxt, mmubase );
  1762.                   a0     d0     a5      a6
  1763.  
  1764.     ULONG ReadUMFlags( ULONG *, WORD, struct IMMUContext *,
  1765.                struct MMUBase *);
  1766.  
  1767.     FUNCTION
  1768.     Reads the USED/MODIFIED flags of the indicated descriptor, returns
  1769.     them and clears them in the descriptor for the next go. This call
  1770.     shall be used to drive a virtual memory engine.
  1771.  
  1772.     INPUTS
  1773.     descr    -    address of the descriptor to be read
  1774.     level    -    level of the descriptor within the MMU tree. Level A
  1775.             is indicated by zero.
  1776.     ctxt    -    pointer to the IMMUContext this descriptor is part of.
  1777.     mmubase    -    base of the mmu.library
  1778.  
  1779.     RESULTS
  1780.     a combination of MAPP_USED and/or MAPP_MODIFIED depending on whether
  1781.     the memory page handled by the descriptor has been read, or touched
  1782.     since the last call of this function or InstallNewPage().
  1783.  
  1784.     NOTES
  1785.     Note that a6 points to the mmu.library base, not to the resource
  1786.     base.
  1787.  
  1788.     This is always called from supervisor mode; do not attempt to call
  1789.     it from user mode. This will be called with all interrupts disabled.
  1790.  
  1791.     This call must:
  1792.  
  1793.     - check whether the descriptor is a page or a table descriptor or
  1794.       invalid or indirect. Table descriptors only carry the USED and
  1795.       not the MODIFIED bit; invalid or indirect descriptors do not carry
  1796.       any status information.
  1797.     - read the descriptor and extract the apropriate bits. These are
  1798.       no bits at all for indirect or invalid descriptors.
  1799.     - push the cache line containing the descriptor back to memory.
  1800.  
  1801.     BUGS
  1802.  
  1803.     SEE ALSO
  1804.     InstallNewPage()
  1805. mmu.resource/SetIndirect                mmu.resource/SetIndirect
  1806.  
  1807.     NAME
  1808.     SetIndirect() - install an indirect page descriptor
  1809.  
  1810.     SYNOPSIS
  1811.     SetIndirect( where, logical, descr, mmubase );
  1812.               a0       a1     d0    a6
  1813.  
  1814.     void SetIndirect( ULONG *, ULONG, ULONG, struct MMUBase * );
  1815.  
  1816.     FUNCTION
  1817.     Installs a new user-generated indirect descriptor at the
  1818.     supplied address and flushes the caches accordingly.
  1819.  
  1820.     INPUTS
  1821.     where    -    physical address into which the descriptor shall go
  1822.     logical    -    logical address of the page that is handled by the
  1823.             descriptor or (ULONG)(~0) if it handles more than
  1824.             one or an unknown logical address
  1825.     descr    -    the descriptor to install
  1826.     mmubase -    base of the mmu.library
  1827.  
  1828.     RESULTS
  1829.  
  1830.     NOTES
  1831.     Note that a6 points to the mmu.library base, not to the resource
  1832.     base.
  1833.  
  1834.     This is always called from supervisor mode; do not attempt to call
  1835.     it from user mode.
  1836.  
  1837.     This call
  1838.  
  1839.     - checks the logical address against ~0. If it is, the ATC is
  1840.       flushed completely, the descriptor is installed, and the
  1841.       cache line containing the ATC is pushed, too.
  1842.     - if it is not, only the ATC for the target logical address is
  1843.       pushed, the descriptor is installed, the cache line is pushed,
  1844.       and the ATC is flushed again.
  1845.  
  1846.     BUGS
  1847.  
  1848.     SEE ALSO
  1849.     SetIndirectArray()
  1850. mmu.resource/SetIndirectArray            mmu.resource/SetIndirectArray
  1851.  
  1852.     NAME
  1853.     SetIndirectArray() - install an array of indirect descriptors at once
  1854.  
  1855.     SYNOPSIS
  1856.     SetIndirectArray ( where, descr, num , mmubase );
  1857.                 a0       a1    d0      a6
  1858.     
  1859.     void SetIndirectArray ( ULONG *, ULONG *, ULONG, struct MMUBase *);    
  1860.  
  1861.     FUNCTION
  1862.     Installs an array of user generated descriptors at once and handles
  1863.     caches accordingly.
  1864.  
  1865.     INPUTS
  1866.     where    -    physical destination address where the descriptors
  1867.             shall go
  1868.     descr    -    logical address of the source array to take the
  1869.             descriptors from
  1870.     num    -    number of descriptors to install, i.e. size of the
  1871.             array in entries
  1872.     mmubase    -    base address of the mmu.library
  1873.  
  1874.     RESULTS
  1875.  
  1876.     NOTES
  1877.     Note that a6 points to the mmu.library base, not to the resource
  1878.     base.
  1879.  
  1880.     This is always called from supervisor mode; do not attempt to call
  1881.     it from user mode.
  1882.  
  1883.     This call shall try to find the most efficient way to install the
  1884.     passed descriptors; for example, it might want to install as many
  1885.     descriptors at once before pushing their cache lines; this call
  1886.     must also flush the ATC when done.
  1887.  
  1888.     BUGS
  1889.  
  1890.     SEE ALSO
  1891.     SetIndirect()
  1892. mmu.resource/WithoutMMU                    mmu.resource/WithoutMMU
  1893.  
  1894.     NAME
  1895.     WithoutMMU() - call a small user interface with the MMU disabled
  1896.  
  1897.     SYNOPSIS
  1898.     res = WithoutMMU( userprocptr, mmubase );
  1899.     d0              a5     a6
  1900.  
  1901.     ULONG WithoutMMU( APTR userproc, struct MMUBase *);
  1902.  
  1903.     FUNCTION
  1904.     Calls the supplied user routine with the MMU and all interrupts 
  1905.     disabled; the user routine must return with RTS and may provide
  1906.     a result code in register d0 that is passed out again.
  1907.  
  1908.     INPUTS
  1909.     userprocptr -    physical address of the user routine to be
  1910.                 called
  1911.     mmubase        -    base address of the mmu.library
  1912.  
  1913.     RESULTS
  1914.     res -    whatever was left in regster d0 by the user routine.
  1915.  
  1916.     NOTES
  1917.     Note that a6 points to the mmu.library base, not to the resource
  1918.     base.
  1919.  
  1920.     This is always called from supervisor mode; do not attempt to call
  1921.     it from user mode.
  1922.  
  1923.     This routine is, in fact, completely register transparent; it
  1924.     returns all the registers that the user routine left in the CPU.
  1925.  
  1926.     Note however that the user routine might not be able to do very
  1927.     much: Due to the disabled MMU, some system structures, or even the
  1928.     complete Os might be absent.
  1929.  
  1930.     The implementation is required to save back some of the MMU state,
  1931.     push all caches, disable the interrupts and the MMU, call the user
  1932.     function, flush the ATC and caches, and restore the MMU state again.
  1933.     It must not touch any registers - or rather, must restore them if it
  1934.     does.
  1935.  
  1936.     BUGS
  1937.     Requires at least the supervisor stack to map the same with and
  1938.     without the MMU. There is no much hope otherwise.
  1939.  
  1940.     SEE ALSO
  1941.     mmu/WithoutMMU()
  1942. mmu.resource/Exception                    mmu.resource/Exception
  1943.  
  1944.     NAME
  1945.     Exception()    -    Handle a bus error exception
  1946.  
  1947.     SYNOPSIS
  1948.     Exception();
  1949.  
  1950.     Exception();
  1951.  
  1952.     FUNCTION
  1953.     This is the complete access error handler of the MMU/CPU combination
  1954.     that is handled by this mmu.resource. You must not call this function;
  1955.     rather, the mmu.library will install the function vector of this
  1956.     routine directly into the vector base of the CPU. It is the job of this
  1957.     routine to supply the ExceptionData structure to user exception
  1958.     handlers, to provide suitable access to the CPU pipelines or provide an
  1959.     emulation thereof, and to emulate accesses into the zero page,
  1960.     including AbsExecBase, if the active context allows so.
  1961.  
  1962.     All this makes this function maybe the most trickiest one of the
  1963.     mmu.library combo.
  1964.  
  1965.     INPUTS
  1966.     None, except the complete MMU/CPU status when this is called on a 
  1967.     bus error. Note that this routine gets no pointer to the mmu.library
  1968.     passed in, even though it is required. Use CheckMMUInterface()
  1969.     above to keep a local copy of the library base somewhere as it is
  1970.     needed.
  1971.  
  1972.     RESULTS
  1973.     None, except that the provided user exception handlers must be
  1974.     handled consistently; if none of them is willing to accept this
  1975.     access error, the system access error handler must be invoked,
  1976.     causing the infamous "Guru".
  1977.  
  1978.     NOTES
  1979.     This is the beasty one.
  1980.  
  1981.     This function shall do the following:
  1982.  
  1983.     - Check for the special branch cache prediction error for the 68060. 
  1984.       If found active, the branch cache must be flushed.
  1985.     - Fetch the active context from the mmu.library base. Check whether
  1986.       this is a user or supervisor access, select the proper context.
  1987.     - Check for long-word reads from AbsExecBase; if found, and the
  1988.       context allows these reads, provide a cached copy of AbsExecBase. 
  1989.       Do *NOT* attempt to read it from the zero page or you end up in an
  1990.       infinite loop.
  1991.       Several strategies exist to provide AbsExecBase access emulation:
  1992.         - place it in the CPU input pipeline if the possibility
  1993.           exists (68020, 68030 only),
  1994.         - emulate the offending instruction by hand. This is easy
  1995.           for simple "move.l" cases.
  1996.         - make the zero page available, enable tracing, let the
  1997.           access happen, catch the trace exception, disable the
  1998.           zero page again. The active context contains a pointer
  1999.           to the zero page descriptor in ctxt->ctx_ZeroPage you
  2000.           may find useful to modify.
  2001.     - Check for physical bus error cases or read/modify/write cycles
  2002.       you need not to handle. If found, restore all registers, and
  2003.       jump into MMUBase->mulib_OldException(). This will call the system
  2004.       guru.
  2005.     - If you decide to handle the access error:
  2006.         Allocate the ExceptionData structure in 
  2007.         MMUBase->mulib_ExceptionData by setting mmuf_busy in
  2008.         MMUBase->mulib_Flags1. If you find this bit "on" already,
  2009.         a double bus fault happened and you better go guru.
  2010.     - Fill in the ExceptionData structure; keep care about special
  2011.       cases as MOVE16, MOVEM with predecrement, FMOVE.X, FMOVE.D when
  2012.       computing the affected logical addresses.
  2013.     - Check whether the fault goes into the readable part of the
  2014.       zero page by comparing against ctxt->ctx_LowMemoryLimit. If the
  2015.       address is larger than this limit, access must be emulated. One
  2016.       approach to handle this is to enable tracing, enable the zero page
  2017.       access by modifying the zero page descriptor pointed to by
  2018.       ctxt->ctx_ZeroPage, re-run the access, catch the trace exception,
  2019.       disable zero page access again.
  2020.     - Check for read exceptions. If found, call the following private
  2021.       function of the mmu.library with the ExceptionData pointer in a0:
  2022.  
  2023.         fatal = CallExceptionHandlers( excdata );
  2024.          d0                 a0
  2025.  
  2026.         BOOL CallExceptionHandlers( struct ExceptionData *);
  2027.  
  2028.       It returns TRUE for a fatal exception; restore registers and
  2029.       jump into MMULib->mulib_OldException() to invoke the guru.
  2030.  
  2031.       Otherwise, check ExceptionData->exc_Flags how to continue.
  2032.     - If (exd_Flags & exdf_call), a user supplied function must be
  2033.       called in user mode, possibly interrupting your access error
  2034.       handler. Luckely, no need to mess with this yourself as the
  2035.       mmu.library can do this for you with the following private 
  2036.       call:
  2037.  
  2038.         SubUser( excd );
  2039.               a5
  2040.     
  2041.         void SubUser( struct ExceptionData *exc );
  2042.  
  2043.     - If (exd_Flags & exdf_readback), the user provided data for the
  2044.       CPU pipeline that shall be read. Check for instruction access
  2045.       errors; if found, go guru and don't try to handle them. Check
  2046.       for REPAIRABLE as well. If not available, go guru as well.
  2047.       If you do not have access to the CPU pipeline, you need to emulate
  2048.       the access to fill the user data: ctxt->ctx_ReadBackPage provides
  2049.       the physical address of a page that is set aside for this mess.
  2050.       Fill this page with the user supplied data in the proper alignment,
  2051.       and modify the descriptor at (not pointed to!) 
  2052.       ctxt->ctx_InvalidIndirect with the proper descriptor. All 
  2053.       "repairable" page descriptors are indirect and point to this
  2054.       descriptor. Enable tracing, let the access happen - now to the
  2055.       ctx_ReadBackPage, and catch the trace exception. Disable tracing,
  2056.       and access to the ReadBackPage, and continue.
  2057.     - Check for write exceptions. If found, check the properties of
  2058.       the descriptors that are accessed. If they indicate "MAPP_ROM",
  2059.       the access must be tolerated without modifying the original page.
  2060.       If you cannot abort the write by fiddling the CPU pipeline, you
  2061.       need to provide an emulation again: Replace the involved pages
  2062.       (at most two due to misalignment) by descriptors pointing to
  2063.       the two pages at ctx->ctx_RomPages, and keep the original
  2064.       descriptors in a temporary. Copy original page data over to the
  2065.       ROM pages of the context, enable tracing, let the access happen.
  2066.       In the trace exception, restore the original descriptors and
  2067.       disable tracing.
  2068.     - Check whether the user likes to see the data that was written
  2069.       out by checking for MAPP_REPAIRABLE; if so, either try to
  2070.       supply from the CPU pipeline if available, otherwise you are
  2071.       in a mess:
  2072.     - Replace again the pages by the context ROM pages, enable
  2073.       tracing, store the complete CPU state, let the access happen,
  2074.       catch the trace exception. Call the user handler/user routines
  2075.       in here and provide the written out data from the ROM pages
  2076.       that got modified at the address you recorded before. In case
  2077.       the user wants to repair the page itself by not setting the
  2078.       exdf_writecomplete flag in ExceptionData, you are now really in
  2079.       a mess:
  2080.       Restore the complete CPU state to what you found during the
  2081.       access error, restore the descriptors and re-start from the point
  2082.       where the access error happens.
  2083.     - If the user does not want the read-out data, call user handlers
  2084.       and SubUser() within the access error handler directly.
  2085.     - If the user signaled re-run by not setting exdf_writecomplete,
  2086.       let the access happen by restoring all registers and running
  2087.       into an RTE. If not, you still need to provide a destination
  2088.       where the write goes into; replace the affected descriptors
  2089.       with the ROM pages of the context, install trace vector,
  2090.       let the access happen and clean up in the trace exception.
  2091.  
  2092.     Good luck, I'm with you in spirit.
  2093.  
  2094.    BUGS
  2095.     Much more needs to be said about this; the implementation depends
  2096.     heavely on the CPU/MMU programming model, and there are little
  2097.     general guidelines I can give here. Test carefully!
  2098.  
  2099.    SEE ALSO
  2100.     Exception.doc, mmu/context.h
  2101.